package admin.forms;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
import admin.data.IdCountData;
import admin.data.ProductData;
import models.DealModel;
import models.ProductModel;

public class DealForm {

	private BlobstoreService blobstoreService = BlobstoreServiceFactory
			.getBlobstoreService();

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void checkValid(HttpServletRequest request, TreeMap check,
			DealModel deal, List<ProductModel> listProduct) {
		HttpSession session = request.getSession();
		String action = (String) session.getAttribute("action");
		TimeZone localTimeZone = TimeZone.getTimeZone("GMT+07:00");
		TimeZone.setDefault(localTimeZone);
		Calendar.getInstance().setTimeZone(localTimeZone);
		String username = (String) request.getParameter("username");
		String contractCode = (String) request.getParameter("contractCode");
		String name = (String) request.getParameter("name");
		String shortName = (String) request.getParameter("shortName");
		String abbreviation = (String) request.getParameter("abbreviation");
		String city = (String) request.getParameter("city");
		String category = (String) request.getParameter("category");
		String productType = (String) request.getParameter("productType");
		String notActiveDeal = (String) request.getParameter("notActiveDeal");
		String startTime = (String) request.getParameter("startTime");
		String endTime = (String) request.getParameter("endTime");
		String dealType = (String) request.getParameter("dealType");
		String userMaximum = (String) request.getParameter("userMaximum");
		String limit = (String) request.getParameter("limit");
		String shipType = (String) request.getParameter("shipType");
		String expireTime = (String) request.getParameter("expireTime");
		String price = (String) request.getParameter("price");
		String priceDiscount = (String) request.getParameter("priceDiscount");
		String priceImport = (String) request.getParameter("priceImport");
		String notePrice = (String) request.getParameter("notePrice");
		String webTitle = (String) request.getParameter("webTitle");
		String displayTime = (String) request.getParameter("displayTime");
		String description = (String) request.getParameter("description");
		String dealCondition = (String) request.getParameter("dealCondition");
		String content = (String) request.getParameter("content");
		String addressInformation = (String) request
				.getParameter("addressInformation");
		String note = (String) request.getParameter("note");
		String mapGoogle = (String) request.getParameter("mapGoogle");
		String productCheck = (String) request.getParameter("productCheck");
		String beTopDeal = (String) request.getParameter("beTopDeal");

		// Check value valid form
		if (username == null || username.isEmpty()) {
			check.put("username", "Bạn cần nhập tên nhân viên kinh doanh.");
		} else {
			deal.setUsername(username);
		}
		if (contractCode == null || contractCode.isEmpty()) {
			check.put("contractCode", "Bạn cần nhập mã hợp đồng.");
		} else {
			deal.setContractCode(contractCode);
		}
		if (name == null || name.isEmpty()) {
			check.put("name", "Bạn cần nhập tên Deal.");
		} else {
			deal.setName(name);
		}
		if (shortName == null || shortName.isEmpty()) {
			check.put("shortName", "Bạn cần nhập tên ngắn cho Deal.");
		} else {
			deal.setShortName(shortName);
		}
		if (abbreviation == null || abbreviation.isEmpty()) {
			check.put("abbreviation", "Bạn cần nhập tên viết tắt cho Deal.");
		} else {
			deal.setAbbreviation(abbreviation);
		}
		if (city == null || city.isEmpty()) {
			check.put("city", "Bạn cần chọn thành phố cho Deal.");
		} else {
			deal.setCity(city);
		}
		if (category == null || category.isEmpty()) {
			check.put("category", "Bạn cần chọn danh mục cho Deal.");
		} else {
			deal.setCategory(category);
		}
		try {
			deal.setProductType(Integer.parseInt(productType));
		} catch (Exception e) {
			check.put("productType", "Loại hình sản phẩm không đúng.");
		}

		DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy HH:mm");
		if (notActiveDeal != null && notActiveDeal.equals("on")) {
			deal.setStatus(0);
		} else {
			try {
				String hour = request.getParameter("startHour");
				String minutes = request.getParameter("startMinutes");
				startTime = startTime + " " + hour + ":" + minutes;
				deal.setStartTime(formatter.parse(startTime));
			} catch (Exception e) {
				check.put("startTime",
						"Bạn cần nhập chính xác thời gian bắt đầu Deal.");
			}
			try {
				String hour = request.getParameter("endHour");
				String minutes = request.getParameter("endMinutes");
				endTime = endTime + " " + hour + ":" + minutes;
				deal.setEndTime(formatter.parse(endTime));
			} catch (Exception e) {
				check.put("endTime",
						"Bạn cần nhập chính xác thời gian kết thúc Deal.");
			}
			if (action != null && action.equals("add")) {
				if (deal.getEndTime().compareTo(
						Calendar.getInstance().getTime()) <= 0) {
					check.put("endTime",
							"Thời gian kết thúc Deal không thể trùng hoặc xảy ra trước thời gian hiện tại.");
				}
			}
			if (deal.getEndTime().compareTo(deal.getStartTime()) <= 0) {
				check.put("endTime",
						"Thời gian kết thúc Deal không thể trùng hoặc xảy ra trước thời gian bắt đầu.");
			}
			try {
				String hour = request.getParameter("expireHour");
				String minutes = request.getParameter("expireMinutes");
				expireTime = expireTime + " " + hour + ":" + minutes;
				deal.setExpireTime(formatter.parse(expireTime));
			} catch (Exception e) {
				check.put("expireTime",
						"Bạn cần nhập chính xác hạn sử dụng Deal.");
			}
			if (action != null && action.equals("add")) {
				if (deal.getExpireTime().compareTo(
						Calendar.getInstance().getTime()) <= 0) {
					check.put("expireTime",
							"Hạn sử dụng Deal không thể trùng hoặc xảy ra trước thời gian hiện tại.");
				}
			}
			if (deal.getExpireTime().compareTo(deal.getStartTime()) <= 0) {
				check.put("expireTime",
						"Hạn sử dụng Deal không thể trùng hoặc xảy ra trước thời gian bắt đầu.");
			}
			if (deal.getExpireTime().compareTo(deal.getEndTime()) < 0) {
				check.put("expireTime",
						"Hạn sử dụng Deal không thể xảy ra trước thời gian kết thúc Deal.");
			}
		}

		try {
			deal.setDealType(Integer.parseInt(dealType));
		} catch (Exception e) {
			check.put("dealType", "Bạn cần chọn chính xác loại Deal.");
		}
		try {
			deal.setUserMaximum(Integer.parseInt(userMaximum));
		} catch (Exception e) {
			check.put("userMaximum",
					"Bạn cần nhập chính xác số lượng tối đa cho một người mua của Deal.");
		}
		try {
			deal.setLimit(Integer.parseInt(limit));
		} catch (Exception e) {
			check.put("limit",
					"Bạn cần nhập chính xác ngưỡng tối đa cho một Deal.");
		}
		try {
			deal.setShipType(Integer.parseInt(shipType));
		} catch (Exception e) {
			check.put("shipType",
					"Bạn cần nhập chính xác hình thức giao hàng của Deal.");
		}

		if (deal.getDealId() == null || deal.getDealId().isEmpty()) {

			/**
			 * Lần đầu tạo deal, nếu admin ko tạo voucher thì tự động tạo một
			 * product tương ứng.
			 */
			if (productCheck != null && productCheck.equalsIgnoreCase("on")) {
				deal.setHasVoucher(true);
				for (int i = 1; i < 6; i++) {
					String productName = request.getParameter("product" + i);
					if (productName != null && productName.length() > 0) {
						String productId = request
								.getParameter("idProduct" + i);
						ProductModel product = new ProductModel();
						if (productId != null && productId.length() > 0) {
							product = ProductData.getById(productId);
						} else {
							product.setProductId(IdCountData.getIdByType("3"));
						}
						product.setName(productName);
						listProduct.add(product);
					}
				}
				if (listProduct.size() == 0) {
					check.put("product", "Bạn cần nhập ít nhất một voucher.");
				}
			} else {
				ProductModel product = new ProductModel();
				product.setName(deal.getShortName());
				product.setProductId(IdCountData.getIdByType("3"));
				listProduct.add(product);
				deal.setHasVoucher(false);
			}
		} else {
			deal.setHasVoucher(true);
			for (int i = 1; i < 6; i++) {
				String productName = request.getParameter("product" + i);
				if (productName != null && productName.length() > 0) {
					String productId = request.getParameter("idProduct" + i);
					ProductModel product = new ProductModel();
					if (productId != null && productId.length() > 0) {
						product = ProductData.getById(productId);
					} else {
						product.setProductId(IdCountData.getIdByType("3"));
					}
					product.setName(productName);
					listProduct.add(product);
				}
			}
			if (listProduct.size() == 0) {
				check.put("product", "Bạn cần nhập ít nhất một voucher.");
			}
		}

		try {
			deal.setPriceImport(Integer.parseInt(priceImport));
			if (deal.getPriceImport() <= 0) {
				check.put("priceImport", "Giá nhập của Deal phải lớn hơn 0.");
			}
		} catch (Exception e) {
			check.put("priceImport",
					"Bạn cần cung cấp chính xác giá nhập của Deal.");
		}
		try {
			deal.setPrice(Integer.parseInt(price));
			if (deal.getPrice() <= 0) {
				check.put("price",
						"Giá bán chưa khuyến mại của Deal phải lớn hơn 0.");
			}
		} catch (Exception e) {
			check.put("price",
					"Bạn cần nhập chính xác giá bán chưa khuyến mại của Deal.");
		}
		try {
			deal.setPriceDiscount(Integer.parseInt(priceDiscount));
			if (deal.getPriceDiscount() <= 0) {
				check.put("priceDiscount",
						"Giá sau khuyến mại của Deal phải lớn hơn 0.");
			} else if (deal.getPriceDiscount() > deal.getPrice()) {
				check.put("priceDiscount",
						"Giá sau khuyến mại không thể lớn hơn giá chưa khuyến mại.");
			}
		} catch (Exception e) {
			check.put("priceDiscount",
					"Bạn cần nhập chính xác giá khuyến mại của Deal.");
		}
		if (notePrice != null && !notePrice.isEmpty()) {
			deal.setNotePrice(notePrice);
		}
		if (webTitle == null || webTitle.isEmpty()) {
			check.put("webTitle", "Bạn cần nhập tiêu đề trình duyệt cho Deal.");
		} else {
			deal.setWebTitle(webTitle);
		}
		if (displayTime != null && displayTime.equalsIgnoreCase("on")) {
			deal.setDisplayTime(true);
		} else {
			deal.setDisplayTime(false);
		}

		if (description == null || description.isEmpty()) {
			check.put("description", "Bạn cần nhập thông tin nổi bật cho Deal.");
		} else {
			deal.setDescription(description);
		}
		if (dealCondition == null || dealCondition.isEmpty()) {
			check.put("description", "Bạn cần nhập điều kiện tham gia Deal.");
		} else {
			deal.setDealCondition(dealCondition);
		}
		if (content == null || content.isEmpty()) {
			check.put("content", "Bạn cần nhập giới thiệu chi tiết cho Deal.");
		} else {
			deal.setContent(content);
		}
		if (addressInformation == null || addressInformation.isEmpty()) {
			check.put("addressInformation",
					"Bạn cần nhập địa chỉ cung cấp Deal.");
		} else {
			deal.setAddressInformation(addressInformation);
		}
		if (mapGoogle != null && mapGoogle.equalsIgnoreCase("on")) {
			String mapInfor = request.getParameter("mapInformation");
			deal.setDisplayMap(true);
			deal.setMapInformation(mapInfor);
		} else {
			deal.setDisplayMap(false);
			Map<String, List<BlobKey>> blobs = blobstoreService
					.getUploads(request);
			List<BlobKey> blobKeys = blobs.get("mapImg");
			if (blobKeys != null) {
				String mapImg = "";
				for (BlobKey blobKey : blobKeys) {
					byte[] arr = blobstoreService.fetchData(blobKey, 0, 20);
					if (arr.length > 0) {
						mapImg = blobKey.getKeyString();
					}
				}
				if (mapImg.length() > 0) {
					deal.setImageMap(mapImg);
				}
			}
		}
		if (note != null && !note.isEmpty()) {
			deal.setNote(note);
		}

		StringBuilder tempString = new StringBuilder();
		Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(request);
		List<BlobKey> blobKeys = blobs.get("dealImages");
		if (blobKeys != null) {
			for (BlobKey blobKey : blobKeys) {
				byte[] arr = blobstoreService.fetchData(blobKey, 0, 20);
				if (arr.length > 0) {
					tempString.append(blobKey.getKeyString() + ",");
				}
			}
			if (tempString.length() > 0) {
				deal.setImageDeal(tempString.toString());
			}
		}
		tempString = new StringBuilder();
		blobKeys = blobs.get("dealSlides");
		if (blobKeys != null) {
			for (BlobKey blobKey : blobKeys) {
				byte[] arr = blobstoreService.fetchData(blobKey, 0, 20);
				if (arr.length > 0) {
					tempString.append(blobKey.getKeyString() + ",");
				}
			}
			if (tempString.length() > 0) {
				deal.setImageSlideshow(tempString.toString());
			}
		}
		if (beTopDeal != null && beTopDeal.equalsIgnoreCase("on")) {
			deal.setDateToOrder(Calendar.getInstance().getTime());
		}
		if (deal.getStatus() != 4) {
			if (notActiveDeal == null || notActiveDeal.isEmpty()) {
				if (deal.getLimit() <= deal.getAmount()) {
					deal.setStatus(3);
				} else if (deal.getStartTime().compareTo(
						Calendar.getInstance().getTime()) > 0) {
					deal.setStatus(1);
				} else {
					deal.setStatus(2);
				}
				if (deal.getEndTime().compareTo(
						Calendar.getInstance().getTime()) <= 0) {
					deal.setStatus(3);
				}
			}
		}
	}

	public static void main(String[] args) {

	}
}
